package com.example.smartmall.controller;

import cn.hutool.core.util.IdUtil;
import cn.hutool.json.JSONUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.net.http.HttpRequest;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@RestController
@RequestMapping("files")
public class UpAndDownController {



    @Value("${file.upload-path}")
    private String uploadPath;

    /**
     * 通用文件上传（支持多文件上传）
     * 返加上传后文件的访问路径
     * 使用wangEditor编辑器时，返回不能为String，需要返回json对象
     * */
    @RequestMapping("upload_files")
    public String uplo_files(@RequestParam("my_file") MultipartFile[] my_file, HttpServletRequest  request) throws IOException {

        //按月份创建文件夹,命名为：2028_1，2028_2管理上传的文件
        int year = LocalDate.now().getYear();
        int month = LocalDate.now().getMonthValue();

        //创建上传目录
        String tarDir = year + "_" + month;
        File up_dir = new File(uploadPath + tarDir);
        if(!up_dir.exists()){
            up_dir.mkdir();
        }

        if(my_file==null||my_file.length==0){
            return "文件不能为null";
        }

        List<String> fileUrls = new ArrayList<String>();

        //循环取出所有文件
        for(MultipartFile tem_file:my_file) {



            //获取原文件名，若文件需要下载，则把原文件名保存到数据库
            String oldName = tem_file.getOriginalFilename();

            //若文件名中不包含后缀，则停止上传
            if(!oldName.contains(".")){
                continue;
            }
            //获取文件格式(后缀)
            String end = oldName.substring(oldName.lastIndexOf("."));
            //生成新的文件名称（使用hutool工具）
            String newName = IdUtil.simpleUUID() + end;
            //创建新文件
            File file2 = new File(up_dir, newName);

            //获取文件访问路径，注意此时需要由配置类，进行访问路径映射(FilePathConfig)
            String fileUrl = "";

            //文件上传
            tem_file.transferTo(file2);

            //获取ip或域名
            String serverName = request.getServerName();

            //获取端口
            int serverPort = request.getServerPort();

            //拼接成外部可以访问的地址  "/upload/" 为路径映射配置的名称
            fileUrl = "http://" + serverName + ":" + serverPort
                        + "/upload/" + tarDir + "/" + newName;
            fileUrls.add(fileUrl);
        }
        if (fileUrls.size()==1){
            return fileUrls.get(0);
        }else{
            return JSONUtil.toJsonStr(fileUrls);
        }

    }


    /**
     * 通用单文件上传
     * 返加上传后文件的访问路径
     * */
    @RequestMapping("upload_file")
    public String singleFileUpload(@RequestParam("my_file") MultipartFile my_file, HttpServletRequest  request){

        //按月份创建文件夹,命名为：2028_1，2028_2管理上传的文件
        int year = LocalDate.now().getYear();
        int month = LocalDate.now().getMonthValue();

        //创建上传目录
        String tarDir = year + "_" + month;
        File up_dir = new File(uploadPath + tarDir);
        if(!up_dir.exists()){
            up_dir.mkdir();
        }

        //获取原文件名，若文件需要下载，则把原文件名保存到数据库
        String oldName = my_file.getOriginalFilename();
        //获取文件格式(后缀)
        String end = oldName.substring(oldName.lastIndexOf("."));
        //生成新的文件名称（使用hutool工具）
        String newName = IdUtil.simpleUUID()+end;
        //创建新文件
        File file2 = new File(up_dir,newName);

        //获取文件访问路径，注意此时需要由配置类，进行访问路径映射(FilePathConfig)
        String fileUrl = "";
        try {
            //文件上传
            my_file.transferTo(file2);

            //获取ip或域名
            String serverName = request.getServerName();

            //获取端口
            int serverPort = request.getServerPort();

            //拼接成外部可以访问的地址  "/upload/" 为路径映射配置的名称
            fileUrl = "http://"+serverName+":" + serverPort
                      + "/upload/"+ tarDir + "/" + newName;

        } catch (IOException e) {
            e.printStackTrace();
        }
        return fileUrl;
    }


    //文件下载
    @RequestMapping("file_down")
    public ResponseEntity<InputStreamResource> downLoadFile(String fileName) throws Exception{
        //此处根据项目自行修改 根据文件名，到数据库查找文件路径，文件原名等信息
        //假设查询到新的文件访问路径如下：
        String fileUrl = "http://localhost:9999/upload/2023_6/f167a6af4b64458d831b343f7cca1053.jpg";
        //则需要下载的文件地址如下：,这里的“/upload/”为映射地址，根据项目自定义,+7为最后一个/的下标
        int index = fileUrl.indexOf("/upload/")+7;
        String last_str = fileUrl.substring(index+1);
        String filePath = uploadPath + last_str;

        FileSystemResource file = new FileSystemResource(filePath);
        HttpHeaders headers = new HttpHeaders();
        headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
        //返回给用户时的文件名称  从数据库取出原名
        String return_fileName = "attachment; filename=" + file.getFilename();
        headers.add("Content-Disposition", return_fileName);
        headers.add("Pragma", "no-cache");
        headers.add("Expires", "0");

        return ResponseEntity.ok()
                .headers(headers)
                .contentLength(file.contentLength())
                .contentType(MediaType.parseMediaType("application/octet-stream"))
                .body(new InputStreamResource(file.getInputStream()));
    }


}
